3. 문장(Statements)을 함수로 옮기기
함수와 같이 사용하는 문장을 함수 안으로 이동 피호출 함수와 한 몸은 아니지만, 여전히 함께 호출돼야 하는 경우라면 둘을 합쳐 별개의 함수로 추출(6.1)하는 방법도 가능
- 특정 함수를 호출할 때 마다 그 앞이나 뒤에서 똑같은 문장이 반복될 때
절차
- 반복 코드가 함수 호출 부분과 멀리 떨어져 있다면 문장 슬라이스하기(8.6)를 적용해 근처로 옮긴다.
- 타깃 함수를 호출하는 곳이 한 곳뿐이면, 단순히 소스 위치에서 해당 코드를 잘라내어 피호출 함수로 복사하고 테스트한다. 이 경우하면 나머지 단계는 무시한다.
- 호출자가 둘 이상이면 호출자 중 하나에서 '타깃 함수 호출 부분과 그 함수로 옮기려는 문장등을 함께' 다른 함수로 추출(6.1)한다. 추출한 함수에 기억하기 쉬운 임시 이름을 지어준다.
- 다른 호출자 모두가 방금 추출한 함수를 사용하도록 수정한다. 하나씩 수정할 때마다 테스트한다.
- 모든 호출자가 새로운 함수를 사용하게 되면 원래 함수를 새로운 함수 안으로 인라인(6.2)한 후 원해 함수를 제거한다.
- 새로운 함수의 이름을 원래 함수의 이름으로 바꿔준다(6.5). (더 나은 이름이 있다면 그 이름을 쓴다)
예시 코드
😞 Before
result.push(`<p>제목: ${person.photo.title}</p>`)
result.concat(photoData(person.photo))
function photoData(aPhoto) {
return [
`<p>위치: ${aPhoto.location}</p>`,
`<p>날짜: ${aPhoto.date.toDateString()}</p>`,
`<p>태그: ${aPhoto.tag}</p>`,
]
}
😃 After
result.concat(photoData(person.photo))
function photoData(aPhoto) {
return [
`<p>제목: ${aPhoto.title}</p>`,
`<p>위치: ${aPhoto.location}</p>`,
`<p>날짜: ${aPhoto.date.toDateString()}</p>`,
`<p>태그: ${aPhoto.tag}</p>`,
]
}